import { ViewChild } from '@angular/core';
import { MessageService } from 'primeng/api';
import { Utils } from '../utils/utils';
import { MessageBoxComponent } from './messagebox';

/**
 * primeng日历的语言国际化标签，公共脚本自动生成
 */
declare var calLang: any;
/**
 * 标志是否要显示等待遮罩。当isRunning大于0时，显示等待遮罩。
 * 各组件如果需要特别显示等待遮罩，应该在开始操作时把isRunning加1，结束操作时把isRunning减1
 */
declare var isRunning: number;
/**
 * 本是Component的基类，所有Component应该继承本类。本类主要有如下：<br>
 * <ul>
 * <li>自动的消息显示</li>
 * <li>便利的i18n相关方法</li>
 * <li>统一的异常处理方法</li>
 * <li>获取请求串中的参数值的方法</li>
 * </ul>
 * 
 * @example
 * import { MessageService } from 'primeng/api';
 * import { BaseComponent } from 'iisp-ng';
 * export class XXXComponent extends BaseComponent{
 *  constructor( messageService:MessageService) {
        super(messageService);}

 *  ...
 *  }
 * 
 */
export abstract class BaseComponent {
    //@ViewChild(MessageBoxComponent) messageBox: MessageBoxComponent;
    /**
     * 日历的国际化消息 <p-calendar >
     */
    calLang = calLang;
    static MSG_SAVED_KEY = "msg.saved.success";
    static MSG_DELETED_KEY = "msg.deleted.success";
    constructor( public messageService: MessageService ) { }
	/**
	 * 解析国际化消息
	 * @param key 键
	 * @param params 参数
	 */
    resolveMessage( key: string, ...params: string[] ): string {
        return Utils.resolveLocalizedMessage( key, params );
    }
    /**
     *  把代码映射成字典表中的i18n值，如果代码为空，则返回代码为defaultKey的值，如果连defaultKey也找不到值，则返回代码本身，如果 代码为null或undefined则返回空串。
     * @param key 要映射的代码,或是RefBean
     * @param dictMap 字典数据
     * @param defaultKey 缺省代码，可选参数，缺省为"-"
     */
    lookup( key: any, dictMap: Object, defaultKey = "-" ): string {
        return Utils.lookup( key, dictMap, defaultKey );
    }
	/**
	 * 处理错误
	 * @param error 错误对象
	 */
    protected handleError( error: any, mboxId?: string ): void {
        this.showMessage( error, "error", mboxId );
    }
	/**
	 * 显示错误消息
	 * @param message 消息
	 */
    protected showError( message: string, mboxId?: string ) {
        this.showMessage( message, "error", mboxId );
    }
	/**
	 * i18n的显示警告消息
	 * @param messageKey 要显示的消息key
	 */
    protected showWarnKey( messageKey: string, mboxId?: string ) {
        this.showMessage( this.resolveMessage( messageKey ), "warn" );
    }
	/**
	 * i18n的显示成功消息
	 * @param messageKey 要显示的消息key
	 */
    protected showSuccessKey( messageKey: string, mboxId?: string ) {
        this.showMessage( this.resolveMessage( messageKey ), "success", mboxId );
    }
	/**
	 * 	i18n的显示通知消息
	 * @param messageKey 要显示的消息key
	 */
    protected showInfoKey( messageKey: string, mboxId?: string ) {
        this.showMessage( this.resolveMessage( messageKey ), "info", mboxId );
    }
	/**
	 * 	i18n的显示错误消息
	 * @param messageKey 要显示的消息key
	 */
    protected showErrorKey( messageKey: string, mboxId?: string ) {
        this.showMessage( this.resolveMessage( messageKey ), "error", mboxId );
    }
	/**
	 * 显示消息
	 * @param message 要显示的消息
	 * @param style 消息风格，"warn","success","info","error"
     * @param mboxId 消息框ID, 缺省为主消息框
	 */

    protected showMessage( message: string, style: string, mboxId: string = MessageBoxComponent.G_MBOX_ID ) {
        let title = Utils.resolveLocalizedMessage( "msg.type." + style );
        this.messageService.add( { key: mboxId, life: MessageBoxComponent.lifeTimeMap[style] * 1000, severity: style, summary: title, detail: message } );
    }
	/**
	 * 获取请求串中的参数值
	 * @param name 参数名称
	 * 
	 */
    protected getRequestParamValue( name: string ): string {
        let result = location.search.match( new RegExp( "[\?\&]" + name + "=([^\&]+)", "i" ) );
        if ( result == null || result.length < 1 ) {
            return null;
        }
        return result[1];
    }
	/**
	 * 获取请求串中的参数值数组，如a=x&a=y, 则参数a的值为['x','y']
	 * @param name 参数名称
	 */
    protected getRequestParamValues( name: string ): string[] {
        let result = location.search.match( new RegExp( "[\?\&]" + name + "=([^\&]+)", "i" ) );
        if ( result == null || result.length < 1 ) {
            return null;
        }
        return result;
    }

	/**
	 * 判断是否有异步任务正在执行，以便界面显示相关信息，让用户等待
	 */
    isRunning(): boolean {
        return isRunning > 0;
    }
}